#include <iostream>
#include <string>
#include <memory>
#include <fstream>
#include <unistd.h>
#include "TcpServer.hpp"
#include "InetAddr.hpp"
#include "Socket.hpp"
#include "Http.hpp"

using namespace Socket_ns;

void Usage(char *proc)
{
    cout << "Usage:\n\t" << proc << "  server_port" << endl;
}

int main(int argc, char *argv[])
{
        if (argc != 2)
        {
            Usage(argv[0]);
            exit(1);
        }

        // int n = daemon(1, 0);
        // if (n < 0) exit(1);

        uint16_t port = std::stoi(argv[1]);
        HttpServer httpserver;

        TcpServer tsvr(port, std::bind(&HttpServer::HttpServerHandler, &httpserver, std::placeholders::_1));

        tsvr.Loop();

    return 0;
}

// int main()
// {
//     string str("aaaaaaa");

//     std::ifstream in(str.c_str(), std::ifstream::binary);
//     if (in.is_open())
//     {

//         in.seekg(0, in.end);
//         int size = in.tellg();
//         in.seekg(0, in.beg);

//         std::cout << "size : " << size << std::endl;
//     }
//     else 
//         std::cout << "open error" << std::endl;

//     return 0;
// }

// int main()
// {

//     std::string reqstr("GET /index.html HTTP/1.1\r\nHost: www.example.com\r\nUser-Agent: Mozilla/5.0\r\nAccept: text/html\r\nConnection: close\r\n\r\nThis is the request body.");
//     HttpRequest req;
//     req.Unserialize(reqstr);
//     req.Print();

//     return 0;
// }

// int main(int argc, char *argv[])
// {
//     uint16_t port = stoi(argv[1]);

//     int sockfd = socket(AF_INET, SOCK_STREAM, 0);

//     struct sockaddr_in addr;
//     bzero(&addr, sizeof(addr));
//     addr.sin_addr.s_addr = INADDR_ANY;
//     addr.sin_family = AF_INET;
//     addr.sin_port = htons(port);

//     InetAddr inetaddr(addr);
//     socket_sptr socket = make_shared<TcpSocket>();

//     return 0;
// }